/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Manejadores;

import java.io.*;
import javax.swing.JTable;
import jxl.write.*;
import jxl.*;

/**
 *
 * @author Facundo
 */
public class ManejadorExportarAExcel {

    private File archivo;
    private JTable tabla;
    private String nombreTab;

    public ManejadorExportarAExcel(File archivo, JTable tabla, String nombreTab) {
        this.archivo = archivo;
        this.tabla = tabla;
        this.nombreTab = nombreTab;
    }

    public boolean exportar() throws IOException, WriteException {
        //Cambio la extensión del archivo si es necesario
        this.cambiarExtension();
        //Me fijo si existe el archivo
        if (this.validarExistencia(this.getArchivo())) {
            //Nuestro flujo de salida para apuntar a donde vamos a escribir
            DataOutputStream out = new DataOutputStream(new FileOutputStream(this.getArchivo()));

            //Representa nuestro archivo en excel y necesita un OutputStream para saber donde va a colocar los datos
            WritableWorkbook w = Workbook.createWorkbook(out);

            //Como excel tiene muchas hojas esta crea o toma la hoja
            //Coloca el nombre del "tab" y el indice del tab
            WritableSheet s = w.createSheet(nombreTab, 0);
            Object objeto = null;
            int largoMaximo = 0;
            //Acá voy recorriendo las columnas de la jTable primero para ir fijandome con el int largoMaximo
            //que tan grande tengo que hacer el ancho de las columnas
            for (int j = 0; j < this.getTabla().getColumnCount(); j++) {
                for (int i = 0; i < this.getTabla().getRowCount() + 1; i++) {
                    //Si i=0 agrego los nombres de las columnas a excel
                    if (i == 0) {
                        objeto = this.getTabla().getColumnName(j);
                        //El +3 está para que no quede tan amontonado todo
                        largoMaximo = String.valueOf(objeto).length() + 3;
                        //Hago que la letra de las columnas sea en negrita
                        WritableFont tituloFont = new WritableFont(WritableFont.ARIAL, 10, WritableFont.BOLD);
                        //Le agrego el tipo de letra al formato
                        WritableCellFormat titulo = new WritableCellFormat(tituloFont);
                        //Creo la celda que irá en la worksheet con su posición, contenido y formato
                        Label labelTitulos = new Label(j, i, String.valueOf(objeto), titulo);
                        //Agrego la celda
                        s.addCell(labelTitulos);
                    } else {
                        //Si i!=0 es que es una celda normal
                        objeto = this.getTabla().getValueAt(i - 1, j);
                        if (String.valueOf(objeto).length() + 3 > largoMaximo) {
                            largoMaximo = String.valueOf(objeto).length() + 3;
                        }
                        //La creo a la celda y la agrego
                        s.addCell(new Label(j, i, String.valueOf(objeto)));
                    }
                    //Hago que el ancho de la columna j sea del tamaño del int largoMaximo
                    s.setColumnView(j, largoMaximo);
                }
            }
            w.write();
            //Cierro el WritableWorkbook y DataOutputStream
            w.close();
            out.close();
            //Si todo sale bien salimos con un true
            return true;
        } else {
            //Si llegamos hasta aqui es que el archivo ya existe.
            return false;
        }
    }

    private boolean validarExistencia(File archivo) {
        //Con este método me fijo que el archivo no exista ya
        if (archivo.exists()) {
            return false;
        } else {
            return true;
        }
    }

    private void cambiarExtension() {
        //Con este método cambio la extensión del archivo a .xls
        String ext = null;
        //Traigo el nombre del archivo
        String s = this.getArchivo().getName();
        int i = s.lastIndexOf('.');
        //Voy buscando despues de la última vez que aparezca un punto
        if (i> 0 && i < s.length()- 1) {
            ext = s.substring(i + 1).toLowerCase();
        }
        //Si encontre que lo último despues del punto es xls no hago nada
        if (ext != null && ext.equals("xls")) {
        } else {
            //Sino cambio la extensión
            s += ".xls";
            this.setArchivo(new File(this.getArchivo().getParentFile(), s));
        }
    }

    public File getArchivo() {
        return archivo;
    }

    public void setArchivo(File archivo) {
        this.archivo = archivo;
    }

    public String getNombreTab() {
        return nombreTab;
    }

    public void setNombreTab(String nombreTab) {
        this.nombreTab = nombreTab;
    }

    public JTable getTabla() {
        return tabla;
    }

    public void setTabla(JTable tabla) {
        this.tabla = tabla;
    }
}
